
/**
 * 缓存接口
 * @author 王锦阳
 * @version 1.0
 * @since 2016-09-01
 */
export interface ICache {
    /**
     * 写入缓存数据的函数（调用该方法会替换掉已缓存的所有数据）
     * @param data 要缓存的数据
     * @param readonly 是否是只读缓存（true：是，false：不是）
     * @returns {boolean} 返回设置结果（true：写入成功，false：写入失败）
     */
    setCache(data: any, readonly?: boolean): boolean;
    /**
     *  根据缓存KEY获取缓存值的函数
     * @param key 缓存KEY
     * @returns {Object} 返回缓存值
     */
    getObject(key: string): any;
    /**
     * 添加缓存元素的函数
     * @param key 缓存键
     * @param value 缓存值
     * @returns {boolean} 返回添加结果（true：添加成功，false：添加失败）
     */
    put(key: string, value: any): boolean;
    /**
     * 根据指定的缓存KEY移除缓存值的函数
     * @param key 缓存KEY
     * @returns {Object} 被移除的缓存值（如果缓存不存在或者是只读缓存则返回null）
     */
    remove(key: string): any;

}

/**
 * 缓存实现类
 * @author 王锦阳
 * @version 1.0
 * @since 2016-09-01
 */
export class Cache implements ICache {

    private _cache: object = {};
    private _readonly: boolean = false;
    private readonly CACHE_KEY: string = "_CACHE_";

    /**
     * 缓存类构造函数
     * @param data 缓存初始化数据对象
     * @param readonly 是否是只读缓存（true：是，false：不是）
     */
    constructor(data?: object, readonly?: boolean) {
        if (data) {
            this.setCache(data, readonly);
        }
        const value: string = sessionStorage.getItem(this.CACHE_KEY);
        if (value) {
            this._cache = JSON.parse(value);
        }
    }

    /**
     * 写入缓存数据的函数（调用该方法会替换掉已缓存的所有数据）
     * @param data 要缓存的数据
     * @param readonly 是否是只读缓存（true：是，false：不是）
     * @returns {boolean} 返回设置结果（true：写入成功，false：写入失败）
     */
    public setCache(data: object, readonly: boolean = false): boolean {
        if (this._readonly) {
            return false;
        }
        this._cache = data;
        this._readonly = readonly;
        return true;
    }

    /**
     *  根据缓存KEY获取缓存值的函数
     * @param key 缓存KEY
     * @returns {Object} 返回缓存值
     */
    public getObject(key: string): Object {
        const value: any = this._cache[key];
        if (value !== undefined && value !== null && value !== "undefined") {
            return value;
        }
        return null;
    }

    /**
     * 添加缓存元素的函数
     * @param key 缓存键
     * @param value 缓存值
     * @returns {boolean} 返回添加结果（true：添加成功，false：添加失败）
     */
    public put(key: string, value: Object): boolean {
        if (this._readonly) {
            return false;
        }
        this._cache[key] = value;
        sessionStorage.setItem(this.CACHE_KEY, JSON.stringify(this._cache));
        return true;
    }

    /**
     * 根据指定的缓存KEY移除缓存值的函数
     * @param key 缓存KEY
     * @returns {Object} 被移除的缓存值（如果缓存不存在或者是只读缓存则返回null）
     */
    public remove(key: string): Object {
        if (this._readonly) {
            return null;
        }
        let value: any = this._cache[key];
        if (value !== undefined && value !== null && value !== "undefined") {
            delete this._cache[key];
        } else {
            value = null;
        }
        return value;
    }

}
